package com.cskaoyan.javase.oop1._12pop;

/**
 * @description: 面向对象
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 把大象放进冰箱
 *
 * 面向对象:
 *    程序需要两个对象即可,冰箱能自动开关门,大象就能走进冰箱
 * 需要大象类和冰箱类
 *
 * 面向对象程序的优缺点:
 *      优点:
 *          1,面向对象的程序的基本单元不是方法,而是一个个对象.并且对象之间虽然有耦合,但整体是独立的
 *              换句话说,面向对象程序是按照功能划分模块,不同模块之间的耦合要比面向过程程序小很多
 *              这样有利于程序员之间合作开发,程序的扩展性和可维护性大大提升
 *          2,面向对象程序按照功能划分模块后,对程序员的要求相对较小
 *
 *       缺点:
 *          1,面向对象的程序有把简单的问题复杂化的趋势,所以代码往往很多,逻辑往往很复杂
 *          2,面向对象程序需要创建对象,还需要关系对象,这是既费时又费力的事情
 *              时空复杂度不高
 *
 *  我们可以根据优缺点,总结用途:
 *          大型的企业级应用开发,小型应用不适用
 * 面向对象也好,面向过程也好,它们都不是技术,也不是语法,而是一种思想的体现
 * Java,Python等语言都是具有面向对象特性的语言,仍然可以写出面向过程的代码
 * 而像典型的C语言,它是没有面向对象特性的语言,但是它仍然可以写出面向对象的代码
 *      比如说操作系统内核OS,它们多数都是用C语言写的,但是它们仍然是面向对象程序
 *
 * 1,怎么看待面向对象?
 *  就是为了程序的扩展性和可维护性
 *
 * 2,我们为什么如此看重程序的扩展性和可维护性?
 * 程序扩展性好,才能成本低,才能创造更多的利润
 *
 */

public class Demo2 {
    public static void main(String[] args) {
        //测试
        Fridge fridge = new Fridge();
        Elephant elephant = new Elephant();
        elephant.f = fridge;

        elephant.into();
        fridge.open();
        elephant.into();
        fridge.close();
    }
}

//冰箱类
class Fridge {
    //需要一个成员变量指示冰箱门的状态
    boolean state = false; //false表示关门,true表示开门

    //开门的方法
    public void open() {
        //'state == false' can be simplified to '!state'
        if (!state) state = true;
    }

    //关门的方法
    public void close() {
        if (state) state = false;
    }
}

//大象类
class Elephant {
    //持有冰箱的对象
    Fridge f;

    //走进冰箱的方法
    public void into() {
        if (f.state) System.out.println("门开了,我进来了");
        else System.out.println("快开门,查水表!");
    }
}
